import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * Creared with IntelliJ IDEA.
 * Description:JDBC是数据库连接是一种用于执行SQL语句的java API,它是java中的数据库连接规范,这个api里面由java.sql.*,javax.sql.*包中的一些类和接口组成,
 * 这些都可以为实现sql做基础,这些都为java开发人员操作数据库提供了一个标准的API,可以为多重关系数据库提供同意的访问
 * JDBC的优势:java语言访问数据库操作完全面向抽象接口编程,开发数据库用用不用限定在的定的数据库厂商的API,程序的可移植性大大增加
 * User:yxd
 * Date:2022-03-13
 * Time:18:11
 */
public class TestJdbc {
    public static void main(String[] args) throws SQLException {
        //DataSourse 是一个接口 是JDBC提供的类和方法中的一个 javax.sql这就是JDBC的包
        DataSource dataSource = new MysqlDataSource();//描述了数据库服务器在哪  DataSource接口通过MysqlDataSource实现具体的方法 向上转型
        //设置数据库所在的地址  向下转型 相关参数的具体类型是DataSource,后面如果数据库进行了改动基本代码不用变属于低耦合的
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
        //jdbc:mysql 表示这个url是JDBC MySQL的url相当于网址  127.0.0.1 IP地址描述了网络上一个主机的位置 这个IP地址是一个特殊的就相当于this直接访问当前主机的IP地址
        //java是要访问的数据库 characterEncoding=utf8是字符编码格式 useSSL=false传输过程中是否需要加密 一般没用重要数据的话不需要加密
        //设置登录数据库的用户名  mysql的默认用户名是root
        ((MysqlDataSource) dataSource).setUser("root");
        //设置登录数据库的密码   密码为自己设置的密码
        ((MysqlDataSource) dataSource).setPassword("123456");

        //2.连接数据库
        Connection connection = dataSource.getConnection();  //要使用jdbc的connection

        //3.赋值语句
        //String sql = "insert into student values('小三',20,1234)";//可以这么写但是这样写固定了可以让用户自己输入  这里的语句不需要加;
        String  sql = "insert into student values(?,?,?)";
        Scanner input = new Scanner(System.in);

        System.out.println("请输入要插入的名字");
        String name = input.next();
        System.out.println("请输入要插入的年龄");

        int age = input.nextInt();
        System.out.println("请输入要插入的id");

        String id = input.next();

        //把字符串风格的sql转化成一个对象
        PreparedStatement statement = connection.prepareStatement(sql); //通过connection里面的prepareStatement方法转换为对象
        //将用户输入的放到sql语句中去
        statement.setString(1,name);//这里的1 2 3 代表?的顺序
        statement.setInt(2,age);
        statement.setString(3,id);
        System.out.println("statement:" + statement);//查看赋值后的语句 用来纠错
        //执行
        //只有select语句需要用到executeQuery
        //insert,update,delete语句都会使用executeUpdate,返回值为一个整数表示影响的语句数
        int a = statement.executeUpdate();
        System.out.println("a=" + a);


        String  sql1 = "insert into student values(?,?,?)";


        System.out.println("请输入要插入的名字");
        String name1 = input.next();
        System.out.println("请输入要插入的年龄");

        int age1 = input.nextInt();
        System.out.println("请输入要插入的id");

        String id1 = input.next();

        //把字符串风格的sql转化成一个对象
        PreparedStatement statement1 = connection.prepareStatement(sql1);//可以多次插入
        //将用户输入的放到sql语句中去
        statement1.setString(1,name);//这里的1 2 3 代表?的顺序
        statement1.setInt(2,age);
        statement1.setString(3,id);
        System.out.println("statement1:" + statement1);//查看赋值后的语句 用来纠错
        //执行
        //只有select语句需要用到executeQuery
        //insert,update,delete语句都会使用executeUpdate,返回值为一个整数表示影响的语句数
        int b= statement1.executeUpdate();
        System.out.println("b=" + b);

        //最后释放资源
        statement.close();//先释放转化
        connection.close();//在释放连接



    }
}
